import java.util.ArrayList;


public class Bord {
	
	private int[] vakjes;
	private Speler spelerX;
	private Speler spelerY;
	private Speler actieveSpeler;
	
	public Bord(Speler X,Speler Y)
	{	
		vakjes = new int[9];
		for(int i = 0 ; i<9 ; i++)
		{
			vakjes[i]=0;
		}
		this.spelerX = X;
		this.spelerY = Y;
		this.actieveSpeler = X;
	}
	
	public Bord() {
		vakjes = new int[9];
		for(int i = 0 ; i<9 ; i++)
		{
			vakjes[i]=0;
		}
	}
	

	public Bord deepCopy() {
        Bord copy = new Bord();
        for (int i=0; i<vakjes.length; i++) {
            copy.vakjes[i] = this.vakjes[i];
        }
        return copy;
    }

	public int[] getVakjes()
	{
		return vakjes;
	}
	
	public int getMark(Speler s)
	{
		if(s == spelerX) return -1;
		else if(s == spelerY) return 1;
		else return 0;
	}
	
	public boolean isFull() {
		boolean res = true;
		for(int i = 0; i < vakjes.length && res; i++) {
			if(vakjes[i] == 0) {
				res = false;
			}
		}
		return res;
	
	}
	
	public Speler getPlayer() {
		return this.actieveSpeler;
	}
	
	public Bord getBord() {
		return this;
	}
	public boolean doeZet(Speler s, int vakje)
	{
		boolean res = false;
		if(vakjes[vakje] == 0)
		{
			//System.out.println(vakjes[vakje]);
			if( s == spelerX )
			{
				//System.out.println("X");

				vakjes[vakje] = -1;
				res = true;
			}
			
			if( s == spelerY){
				//System.out.println("Y");

				vakjes[vakje] = 1;
				res = true;
			}
		}
		if(res) {
			actieveSpeler = (actieveSpeler.equals(spelerX) ? spelerY : spelerX);

		}
		return res;
	}

	public String toString()
	{		
		String delim = "-----\r\n";
		return ""+markDecoder(vakjes[0])+"|"+markDecoder(vakjes[1])+"|"+markDecoder(vakjes[2])+"\r\n"+delim+
				 markDecoder(vakjes[3])+"|"+markDecoder(vakjes[4])+"|"+markDecoder(vakjes[5])+"\r\n"+delim+
				 markDecoder(vakjes[6])+"|"+markDecoder(vakjes[7])+"|"+markDecoder(vakjes[8])+"\r\n";
	}
	
	public boolean isEndstate() {
		boolean res = false;
		if(this.isFull() || this.checkVictory() != null) {
			res = true;
		}
		return res;
	}
	
	public ArrayList<Integer> getActions() {
		ArrayList<Integer> res = new ArrayList<Integer>();
		for(int i=0;i<this.vakjes.length;i++) {
			if(this.vakjes[i]==0) {
				res.add(i);
			}
		}
		return res;
	}
	
	public Speler checkVictory()
	{
		if( (vakjes[0] == -1) && (vakjes[1] == -1) && (vakjes[2]==-1)) return spelerX;
		if( (vakjes[0] == -1) && (vakjes[4] == -1) && (vakjes[8]==-1)) return spelerX;
		if( (vakjes[0] == -1) && (vakjes[3] == -1) && (vakjes[6]==-1)) return spelerX;
		
		if( (vakjes[1] == -1) && (vakjes[4] == -1) && (vakjes[7]==-1)) return spelerX;
		if( (vakjes[3] == -1) && (vakjes[4] == -1) && (vakjes[5]==-1)) return spelerX;
		
		if( (vakjes[6] == -1) && (vakjes[7] == -1) && (vakjes[8]==-1)) return spelerX;
		if( (vakjes[2] == -1) && (vakjes[5] == -1) && (vakjes[8]==-1)) return spelerX;
		
		if( (vakjes[6] == -1) && (vakjes[4] == -1) && (vakjes[2]==-1)) return spelerX;
			
		if( (vakjes[0] == 1) && (vakjes[1] == 1) && (vakjes[2]==1)) return spelerY;
		if( (vakjes[0] == 1) && (vakjes[4] == 1) && (vakjes[8]==1)) return spelerY;
		if( (vakjes[0] == 1) && (vakjes[3] == 1) && (vakjes[6]==1)) return spelerY;
		
		if( (vakjes[1] == 1) && (vakjes[4] == 1) && (vakjes[7]==1)) return spelerY;
		if( (vakjes[3] == 1) && (vakjes[4] == 1) && (vakjes[5]==1)) return spelerY;
		
		if( (vakjes[6] == 1) && (vakjes[7] == 1) && (vakjes[8]==1)) return spelerY;
		if( (vakjes[2] == 1) && (vakjes[5] == 1) && (vakjes[8]==1)) return spelerY;
		
		if( (vakjes[6] == 1) && (vakjes[4] == 1) && (vakjes[2]==1)) return spelerY;
				
		return null;
	}
	
	public int calculateValue(Bord b)
	{	
		//TODO nog iets verzinnen om af te gaan tellen
		if(b.checkVictory() == null)
		{
			boolean single = true;
			int one = 0;
			int two = 0;
			
			//check vakje 0
			
			if(b.getVakjes()[0] == b.getVakjes()[1]) {two++;single = false;}
			if(b.getVakjes()[0] == b.getVakjes()[3]) {two++;single = false;}
			if(b.getVakjes()[0] == b.getVakjes()[4]) {two++;single = false;}
			if(single) one++;
			
			//check vakje 1
			single = false;
			
			if(b.getVakjes()[1] == b.getVakjes()[0]) {two++;single = false;}
			if(b.getVakjes()[1] == b.getVakjes()[2]) {two++;single = false;}
			if(b.getVakjes()[1] == b.getVakjes()[3]) {two++;single = false;}
			if(b.getVakjes()[1] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[1] == b.getVakjes()[5]) {two++;single = false;}
			
			if(single) one++;
			
			//check vakje 2
			single = false;
			if(b.getVakjes()[2] == b.getVakjes()[2]) {two++;single = false;}
			if(b.getVakjes()[2] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[2] == b.getVakjes()[5]) {two++;single = false;}
			if(single) one++;

			//check vakje 3
			single = false;
			
			if(b.getVakjes()[3] == b.getVakjes()[0]) {two++;single = false;}
			if(b.getVakjes()[3] == b.getVakjes()[1]) {two++;single = false;}
			if(b.getVakjes()[3] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[3] == b.getVakjes()[6]) {two++;single = false;}
			if(b.getVakjes()[3] == b.getVakjes()[7]) {two++;single = false;}
			if(single) one++;
			
			//check vakje 4
			single = false;
			if(b.getVakjes()[4] == b.getVakjes()[0]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[1]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[2]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[3]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[5]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[6]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[7]) {two++;single = false;}
			if(b.getVakjes()[4] == b.getVakjes()[8]) {two++;single = false;}
			if(single) one++;
			
			//check vakje 5
			single = false;
			if(b.getVakjes()[5] == b.getVakjes()[1]) {two++;single = false;}
			if(b.getVakjes()[5] == b.getVakjes()[2]) {two++;single = false;}
			if(b.getVakjes()[5] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[5] == b.getVakjes()[7]) {two++;single = false;}
			if(b.getVakjes()[5] == b.getVakjes()[8]) {two++;single = false;}
			if(single) one++;
			
			//check vakje 6
			single = false;
			if(b.getVakjes()[6] == b.getVakjes()[3]) {two++;single = false;}
			if(b.getVakjes()[6] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[6] == b.getVakjes()[7]) {two++;single = false;}
			if(single) one++;

			//check vakje 7
			single = false;
			if(b.getVakjes()[7] == b.getVakjes()[3]) {two++;single = false;}
			if(b.getVakjes()[7] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[7] == b.getVakjes()[5]) {two++;single = false;}
			if(b.getVakjes()[7] == b.getVakjes()[6]) {two++;single = false;}
			if(b.getVakjes()[7] == b.getVakjes()[8]) {two++;single = false;}
			if(single) one++;
			
			//check vakje 8
			single = false;
			if(b.getVakjes()[8] == b.getVakjes()[4]) {two++;single = false;}
			if(b.getVakjes()[8] == b.getVakjes()[5]) {two++;single = false;}
			if(b.getVakjes()[8] == b.getVakjes()[7]) {two++;single = false;}
			if(single) one++;		
		}
		return 0;
	}
	
	private String markDecoder(int m)
	{
		if( m<0 ) return "X" ;
		else if( m==0) return " ";
		else return "Y" ;
	}
	
	private int spelerToMark(Speler s)
	{
		if(s==spelerX) return -1;
		else if(s==spelerY) return 1;
		else return 0;
	}
}
